using System;
using System.IO;
using System.Web;
using System.Web.Services;
using System.Web.SessionState;
using System.Globalization;
using System.Text;
using LarDosIdosos.Business.Model;
using LarDosIdosos.DataSources;

namespace LarDosIdosos.Arquivos
{	
	public class Documento
    {
        public string nomeDoArquivo { get; set; }
        public string caminhoDoArquivo { get; set; }
        public byte[] bufferArquivo { get; set; }
        public string extensaoDoDocumento { get; set; }
    }

    /// <summary>
    /// Summary description for $codebehindclassname$
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class Arquivo : IHttpHandler, IRequiresSessionState
    {

        public void ProcessRequest(HttpContext context)
        {
            Documento doc = null;
            string stringParaLog = "";
            try
            {

                if (!string.IsNullOrEmpty(context.Request["relatorio"]))
                {
                    string codigoIdoso = context.Request["relatorio"];
                    DataSources.DataSourceIdoso dataSourceIdoso = new DataSourceIdoso();
                    Idoso idoso = dataSourceIdoso.BuscaIdoso(Convert.ToInt32(codigoIdoso));
                    doc = MontaDocumento(idoso.Relatorio_De_Encaminhamento);
                }
                PreparaEEnviaDocumento(context, doc);

            }
            catch (Exception ex)
            {
                
            }
            finally
            {
                context.Response.End();
            }
        }

        private static Documento MontaDocumento(string arquivo)
        {
            //string normalize = arquivo.Normalize(NormalizationForm.FormD);
            //StringBuilder stringBuilder = new StringBuilder();

            //for (int k = 0; k < normalize.Length; k++)
            //{
            //    UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(normalize[k]);
            //    if (uc != UnicodeCategory.NonSpacingMark)
            //    {
            //        stringBuilder.Append(normalize[k]);
            //    }
            //}
            Documento doc = new Documento();
            doc.extensaoDoDocumento = Path.GetExtension(arquivo);
            if (arquivo.Contains("/"))
            {
                arquivo = arquivo.Replace("\\", "/");
            }
            else
            {
                arquivo = arquivo.Replace("/", "\\");
            }
            doc.caminhoDoArquivo = arquivo;
            if (arquivo.Contains("/"))
            {
                doc.nomeDoArquivo = arquivo.Substring(arquivo.LastIndexOf('/') + 1);
                doc.bufferArquivo = File.ReadAllBytes(AppDomain.CurrentDomain.BaseDirectory + "Arquivos" + arquivo);
            }
            else
            {
                doc.nomeDoArquivo = arquivo.Substring(arquivo.LastIndexOf('\\') + 2);
                doc.bufferArquivo = File.ReadAllBytes(string.Format("{0}\\{1}", arquivo, doc.caminhoDoArquivo));
            }
            return doc;
        }
        
        private static void PreparaEEnviaDocumento(HttpContext context, Documento doc)
        {
            if(doc == null) return;
            
            //Note; Valor original!
            //context.Response.AppendHeader("Content-Disposition", string.Format("attachment; filename={0}", doc.nomeDoArquivo));
            
            context.Response.Clear();
            context.Response.ClearHeaders();
            context.Response.ClearContent();
            
            context.Response.ContentType = "application/octet-stream";
            context.Response.AppendHeader("content-length", doc.bufferArquivo.Length.ToString());

            //Note: Esse comando faz o documento abrir no browser.
            context.Response.AppendHeader("Content-Disposition", "inline; filename=\"" + doc.nomeDoArquivo + "\"");
            context.Response.BinaryWrite(doc.bufferArquivo);
            
            //ToDo: A linha abaixo evita de carregar o arquivo na memória do computador. Ou seja, sem risco de sobrecarga da memória. (Transmitfile keeps entire file from loading into memory.)
            //Response.TransmitFile(documentPath);

            context.Response.Flush();
        }

        private static void InteractivePause(TimeSpan length)
        {
            DateTime start = DateTime.Now;
            TimeSpan restTime = new TimeSpan(200000); // 20 milliseconds 
            while (true)
            {
                System.Windows.Forms.Application.DoEvents();
                TimeSpan remainingTime = start.Add(length).Subtract(DateTime.Now);
                if (remainingTime > restTime)
                {
                    // Wait an insignificant amount of time so that the CPU usage doesn't hit the roof while we wait. 
                    System.Threading.Thread.Sleep(restTime);
                }
                else
                {
                    if (remainingTime.Ticks > 0)
                        System.Threading.Thread.Sleep(remainingTime);
                    break;
                }
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
	}
}

